本篇文章內有:
現在可以來進行我們的重頭戲 AWS CDK ,先新增一個資料夾。
進去資料夾之後,直接使用 npm 就收工了。
npm exec --package=aws-cdk -- cdk init sample-app --language=typescript
在這行指令中,我們告訴 npm 去執行 (exec) 在 aws-cdk 這個 package 中的 cdk 指令,並且跟 cdk 說做專案的初始化 (init) 時,使用 sample-app 模板生成出 typescript 專案。
只有在這次執行時, npm 會跳出下面的訊息。
Need to install the following packages:
  aws-cdk@2.x.x
Ok to proceed? (y)
直接按 Enter 就可以。
其實到這邊,我們就可以來試著部署他。
但是在部署之前,一定要先來看看這個專案的生辰八字,我是說,看他的檔案結構。
在 Visual Studio Code 中,開啟我們的專案。
code .
檔案的名稱可能會不同,請不要擔心,他是利用資料夾名字自動產生的,並不會影響實際行為。
先簡單地依序介紹一下資料夾結構:
bin:AWS CDK 主要的進入點。lib:AWS CDK 中會引用的所有資源。node_modules:npm 存放 packages 的地方,基本上可以忽略。test:AWS CDK 編寫測試的地方。.gitignore:git 的除外清單,基本上可以忽略。.npmignore:npm 的除外清單,基本上可以忽略。cdk.json:AWS CDK CLI 的設定檔。jest.config.js:測試的設定檔。package-lock.json:npm package 的詳細版號設定,不是人讀的。package.json:npm 的基本設定,包含常用指令與 package 版號。README.md:專案的說明文件。tsconfig.json:TypeScript 的設定檔。也就是說,我們會頻繁改動的檔案就只有前兩個資料夾 (bin, lib) 。
好的,說了這麼多,我們要來使用 AWS CDK CLI 了,首先來查看一下目前的 AWS CDK CLI 會針對哪個 AWS 帳號做更動。
aws sts get-caller-identity
這個指令是跟 aws 說,去跟訪問權限中心,也就是 AWS Security Token Service (sts) 問一下,我現在的身分是誰 (get-caller-identity) 。
如果看到以下錯誤訊息,請設置 AWS CLI,附錄中有相關步驟。
Unable to locate credentials. You can configure credentials by running "aws configure".
我們今天先簡單地看這個 AWS CDK 專案裡面有哪些東西。
npm run cdk -- list
這指令是告訴 npm 去執行 (run) 名為 cdk 的腳本,而其中所對應的 cdk 指令會列出 (list) 內含的資源。
應該會得到類似的輸出,名稱會因為資料夾不同有所差異。
SampleAppStack
接下來可以看更多的細節,我們查查看跟 AWS 帳號內的資源的差異。
npm run cdk -- diff
如果看到類似的輸出,就代表已經成功地做出第一個 CDK 專案,並且可以跟 AWS 帳號交換資訊了。
Stack SampleAppStack
current credentials could not be used to assume 'arn:aws:iam::123456789012:role/cdk-hnb659fds-lookup-role-123456789012-us-east-1', but are for the right account. Proceeding anyway.
(To get rid of this warning, please upgrade to bootstrap version >= 8)
current credentials could not be used to assume 'arn:aws:iam::123456789012:role/cdk-hnb659fds-deploy-role-123456789012-us-east-1', but are for the right account. Proceeding anyway.
IAM Statement Changes
┌───┬───────────┬────────┬───────────┬───────────┬─────────────┐ 
│   │ Resource  │ Effect │ Action    │ Principal │ Condition   │ 
├───┼───────────┼────────┼───────────┼───────────┼─────────────┤ 
│ + │ ${SampleA │ Allow  │ sqs:SendM │ Service:s │ "ArnEquals" │ 
│   │ ppQueue.A │        │ essage    │ ns.amazon │ : {         │ 
│   │ rn}       │        │           │ aws.com   │   "aws:Sour │ 
│   │           │        │           │           │ ceArn": "${ │ 
│   │           │        │           │           │ SampleAppTo │ 
│   │           │        │           │           │ pic}"       │ 
│   │           │        │           │           │ }           │ 
└───┴───────────┴────────┴───────────┴───────────┴─────────────┘ 
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)
Parameters
[+] Parameter BootstrapVersion BootstrapVersion: {"Type":"AWS::SSM::Parameter::Value<String>","Default":"/cdk-bootstrap/hnb659fds/version","Description":"Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"}
Conditions
[+] Condition CDKMetadata/Condition CDKMetadataAvailable: {"Fn::Or":[{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"af-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-northwest-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"sa-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-2"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-2"]}]}]}
Resources
[+] AWS::SQS::Queue SampleAppQueue SampleAppQueueECFF513D        
[+] AWS::SQS::QueuePolicy SampleAppQueue/Policy SampleAppQueuePolicyC68AAFE2
[+] AWS::SNS::Subscription SampleAppQueue/SampleAppStackSampleAppTopic1FB495E2 SampleAppQueueSampleAppStackSampleAppTopic1FB495E2F636FD34
[+] AWS::SNS::Topic SampleAppTopic SampleAppTopicA1D4DBDE        
Other Changes
[+] Unknown Rules: {"CheckBootstrapVersion":{"Assertions":[{"Assert":{"Fn::Not":[{"Fn::Contains":[["1","2","3","4","5"],{"Ref":"BootstrapVersion"}]}]},"AssertDescription":"CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."}]}}
✨  Number of stacks with differences: 1
在建立好 CDK 專案並且跟 AWS 帳號設定完成後,接著就是要來愉快的花錢,歐,對,新的 AWS 帳號會有 12 個月的有限度免費服務,所以實際上不會破費,太好了!
為了要設置 AWS CLI ,我們產生 AWS Access Key ,而這個動作要在 AWS Console 上面完成。
從右上角的帳戶名稱進入 Security credentials ,在中間的 Access keys 點選 Create access key 。
這個訊息是 AWS 強烈 不建議這個做法,因為會造成的資安危害程度不可估計。
如果想要繼續,請勾選下面的I understand ,並心驚膽顫地跳過接下來的小小節。
如果覺得猶豫,不要誤動作,請建立 AWS IAM User 。
在最左側有三個橫槓,請點下去,在下面的選單中,請點 Access management > Users ,點選右邊的 Create user 。
指定好名稱後,可以下一步連點,直接將沒有權限的使用者建立出來。
這時會有綠色的通知出現,點右邊的 View user 。
進來之後,我們在右邊的 Add permissions 裡面,選 Create inline policy 。
一樣是在右邊,有 JSON 的按鈕,點進去之後,先將原有的內容刪除,再貼上下面的 JSON 物件,接著直接建立。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudformation:CreateChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:GetTemplate"
            ],
            "Resource": "arn:aws:cloudformation:*:*:stack/CDKToolkit/*",
            "Effect": "Allow",
            "Sid": "CloudFormationPermissions"
        },
        {
            "Action": [
                "iam:CreateRole",
                "iam:GetRole",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::*:policy/*",
                "arn:aws:iam::*:role/cdk-*"
            ]
        },
        {
            "Action": [
                "ssm:DeleteParameter",
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:PutParameter"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:*:parameter/cdk-bootstrap/*"
            ]
        },
        {
            "Action": [
                "s3:CreateBucket",
                "s3:PutBucketPolicy",
                "s3:PutBucketPublicAccessBlock",
                "s3:PutBucketVersioning",
                "s3:PutEncryptionConfiguration",
                "s3:PutLifecycleConfiguration"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::cdk-*"
            ]
        },
        {
            "Action": [
                "ecr:CreateRepository",
                "ecr:DescribeRepositories",
                "ecr:SetRepositoryPolicy",
                "ecr:PutLifecyclePolicy"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ecr:*:*:repository/cdk-*"
            ]
        },
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::*:role/cdk-*"
            ]
        }
    ]
}
成功之後,進到第四個分頁, Security credentials ,來到下面的 Access keys 區域,點選中間的 Create access key 。
現在看到的是 AWS 針對各種情境所提供的替代方案,這邊就不深入一一介紹,畢竟已經爆字數了,選擇任何一個選項都行,並不會影響到接續的動作。
第二步則是選填項目,可以略過。
好的,終於拿到關鍵的 Access key 了,先不要離開這個頁面。
這時我們要來設定 AWS 的驗證資訊,使用下面的指令開始。
aws configure
他會提示要輸入 AWS Access Key ID 以及 AWS Secret Access Key ,請直接從網頁上複製,左邊有個小按鈕可以幫忙複製起來。
直接貼入到 CLI 的畫面中。
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: 
Default output format [None]: 
這時我們再執行一次剛剛失敗的指令。
aws sts get-caller-identity
如果看到類似的輸出,就表示成功了。
{
    "UserId": "AIDASAMPLEUSERID",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/DevAdmin"
}
如果有想用多個不同驗證資訊,不管是不是同一個帳號,都可以在 CLI 中做 AWS Profile 的設定,可以帶在指令中,像是 --profile ,這邊推薦從環境變數中設置。
macOS:
export AWS_PROFILE='{{your-profile-name}}'
Windows:
$env:AWS_PROFILE='{{your-profile-name}}'